UI Components

UI组件

Fuse附带了许多可用于构建用户界面的UI组件。在UX中,您可以通过将UI组件包含在标记中来添加它们:

<Image File =“MyImage.png”/>
<Rectangle Width =“50”Height =“50”Fill =“#888”/>
<Text> Hello world!</ Text>

注意,只是因为某物被包含在标签中,并不一定意味着它必须是一个UI组件。UX对其他概念也使用标签,例如TriggersActions

Text

这里是一个微小的应用程序,呈现文本:

<App>
    <Text> Hello,world!</ Text>
</ App>

这是伟大的,但当你有更长的文本段落,如Lorem Ipsum,你最有可能想要启用字包装。在Fuse中,这是通过Text控件上的TextWrapping属性来完成的:

<Text TextWrapping =“Wrap”> Lorem Ipsum(...)</ Text>

如果你仍然发现包装文本仍然很难显示你想要的所有内容,你可能想考虑将内容添加到ScrollView或更改FontSizeTextWrapping可以设置为WrapNoWrap(默认)。

字体

您可以从包含TrueType字体的ttf文件导入字体。由于字体通常在整个应用程序中引用,因此最好简单地为其创建一个 全局资源

<App>
    <Font File =“Roboto-Medium.ttf”ux:Global =“Medium”/>
    <Font File =“Roboto-Light.ttf”ux:Global =“Light”/>
    <StackPanel>
        <Text Font =“Light”> Roboto Light </ Text>
        <Text Font =“Medium”> Roboto Medium </ Text>
        <Text Font =“Light”> Roboto Light再次</ Text>
    </ StackPanel>
</ App>

在此示例中,字体位于与相关UX文件相同的目录中。这种导入字体的方式确保字体在整个项目中可用,并且只加载一次。

iOS和Android都支持使用多字节字符集的文本呈现。这意味着emojis在设备上工作精细渲染。

Note!目前有一些问题使用桌面预览呈现多字节字符集。不要惊讶,如果桌面渲染不匹配设备呈现100%。这是一个正在处理的问题。

文本属性

为了进一步控制如何渲染文本,可以设置TextAlignmentTextColorFontSizeLineSpacing:

<Text TextColor =“#999”>左</ Text>
<Text TextAlignment =“Center”>中心</ Text>
<Text FontSize =“24”TextAlignment =“Right”> Right </ Text>
<Text LineSpacing =“10”>
多
线
</ Text>

在本示例中,第一个文本元素将左对齐,因为这是默认值,并且其颜色设置为中间浅灰色。第二个文本将居中对齐。第三个将右对齐,并具有较大的字体。第四个将跨越两条线,其间有10个空间。TextAlignment'的有效值为Left(默认),RightCenter`。

Number

虽然文本是在大多数情况下,你可以使用Number来显示一个格式化的数值。
通过“Format”属性指定的格式必须是标准数字格式字符串的形式。

Number当前支持的唯一格式是F,它截断要显示的小数位数。

下面的代码将渲染3.141:

<Number Value =“3.14159265359”Format =“F03”/>

图片

保险丝支持本地显示PNG和JPEG文件(在RGB颜色空间中)。显示图像:

<App>
    <Image File =“FuseLogo.png”/>
</ App>

此代码假定文件FuseLogo.png与UX文件存在于同一目录中。如果你想从互联网加载图像的内容,只需:

<Image Url =“http:// path_to_image”/>

Note!如果你是从web开发人员的背景,你可能习惯于分配一个URL到src属性。虽然Image有一个Source属性,它用于为一个图像分配一个Resource。在这个上下文中,这个“Resource”是一个“HttpImageSource”,但是它是为你自动在封面后面创建的,所以坚持使用Url`-property从网页加载内容。

###来自资源的图像内容

对于其他方法加载图像数据的一个小例子,这里是一个小例子,也使用JavaScript中的数据绑定:

<FileImageSourceux:Key =“pic2”File =“Images / Image2.jpg”/>
<StackPanel>
    <JavaScript>
        module.exports = {
            imageResource:“pic2”,
            url:“http://somewhereontheinternet/Cute-Cat.jpg”
        }}
    </ JavaScript>
    <Image File =“Images / Image1.jpg”/>
    <Image Source =“{DataToResource imageResource}”/>
    <Image Url =“{url}”/>
</ StackPanel>

此代码将显示三个图像堆叠在彼此的顶部。最上面的图像将作为项目的一部分的文件提取。在顶部,我们通过创建一个FileImageSource来引用一个文件,我们使用DataToResource绑定到一个图像。这将从它从JavaScript获取的键查找资源。我们还得到一个图片在网络上的URL并绑定到一个图像'的Url`属性。如果这看起来很复杂,不要担心:我们稍后将更多地看看数据绑定JavaScript

###图像颜色

可以通过使用“颜色”属性来对“图像”进行着色。请注意,这将以最可预测的方式影响最接近白色的图像部分。例如:

<Image File =“WhiteIcon.png”Color =“#f00”/>

这将使白色图标变红。

Debug –>

按钮是可点击的控件,它们的外观和感觉从主题

<App Theme =“Basic”>
    <Button Text =“点击我!ux:Name =“button1”>
        <Clicked>
            <Set button1.Text =“Clicked!” />
        </ Clicked>
    </ Button>
</ App>

这个小例子将创建一个覆盖整个屏幕的“Button”。当您点击它时,其标签将从“点击我!到“点击!”。

在Fuse,几乎任何东西都可以很容易地做可点击(和tappable等)。因此,如果您想为按钮设计自定义的外观和感觉,可以使用任何组件:

<App>
    <Rectangle Fill =“#309”>
        <Clicked>
            <DebugAction Message =“Rectangle got clicked”/>
        </ Clicked>
    </ Rectangle>
</ App>

当您单击矩形时,如果您在预览模式下运行,则“Message”输出将显示在Monitor中。它也将显示在标准设备日志中,或者,如果您从命令行启动预览过程,在标准控制台中。

事件触发器

“Button”也可以接受“Clicked”作为event-trigger:

<App Theme =“Basic”>
    <JavaScript>
        module.exports = {
            buttonClick:function(args){console.log(“Button was clicked”); }}
        }}
    </ JavaScript>
    <Button Text =“点击我!Clicked =“{buttonClick}”/>
</ App>

当你想从事件中驱动业务逻辑时,这是很方便的。

Switch

为了接受开/关式输入,Fuse有一个Switch-control:

<开关/>

要使其对打开响应,您可以使用WhileTrue-trigger:

<App Theme =“Basic”>
    <StackPanel>
        <Switch>
            <WhileTrue>
                <Change rectangle.Width =“160”Duration =“0.5”
                    Easing =“CircularInOut”/>
            </ WhileTrue>
        </ Switch>
        <Rectangle ux:Name =“rectangle”Width =“70”Height =“70”Fill =“#909”/>
    </ StackPanel>
</ App>

要使它处于相反的状态,可以使用WhileFalseWhileTrue Invert =“true”

如果你想要“开关”开始被激活:

<Switch Value =“true”/>

Switch发出的事件也可以从JavaScript处理:

<App Theme =“Basic”>
    <JavaScript>
        module.exports = {
            switchChanged:function(args){
                console.log(“Switch value is:”+ args.value);
            }}
        };
    </ JavaScript>
    <StackPanel>
        <Switch Value =“true”ValueChanged =“{switchChanged}”/>
    </ StackPanel>
</ App>

###数据绑定开关

你也可以使用它的’Value属性来数据绑定Switch`:

<App Theme =“Basic”>
    <JavaScript>
        var Observable = require(“FuseJS / Observable”);

        var switchValue = Observable(false);

        module.exports = {
            switchValue:switchValue,
            enableSwitch:function(){switchValue.value = true; },
            disableSwitch:function(){switchValue.value = false; },
            switchChanged:function(args){
                console.log(“Switch value is:”+ args.value);
            }}
        };
    </ JavaScript>
    <StackPanel>
        <Switch Value =“{switchValue}”ValueChanged =“{switchChanged}”/>
        <Grid ColumnCount =“2”>
            <Button Text =“Disable”Clicked =“{disableSwitch}”/>
            <Button Text =“Enable”Clicked =“{enableSwitch}”/>
        </ Grid>
    </ StackPanel>
</ App>

滑块

要显示滑块:

<Slider />

要对正在移动的滑块作出反应,请使用ProgressAnimation。考虑这个代码,它允许你从0到90度旋转Rectangle:

<StackPanel>
    <Slider>
        <ProgressAnimation>
            <Rotate Target =“rectangle”Degrees =“90”/>
        </ ProgressAnimation>
    </ Slider>
    <Rectangle ux:Name =“rectangle”Width =“100”Height =“100”Fill =“#808”/>
</ StackPanel>

你也可以听’ValueChanged`事件:

<App Theme =“Basic”>
    <JavaScript>
        module.exports = {
            sliderValueChanged:function(args)
            {
                console.log(“Value:”+ args.value);
            }}
        };
    </ JavaScript>
    <Slider ValueChanged =“{sliderValueChanged}”/>
</ App>

当将滑块从最左侧移动到最右侧时,控制台将输出0到100之间的浮点数,这是默认的“最小值”和“最大值”。这些属性也可以设置:

<滑块最小值=“4”最大值=“42”/>

###数据绑定滑块

也可以对滑块位置进行数据绑定:

<App Theme =“Basic”>
    <JavaScript>
        var Observable = require(“FuseJS / Observable”);

        var sliderValue = Observable(42);
        var sliderLabel = sliderValue.map(function(val){
            return“当前位置:”+ val;
        });

        module.exports = {
            sliderValue:sliderValue,
            sliderLabel:sliderLabel
        };
    </ JavaScript>
    <StackPanel>
        <Slider Value =“{sliderValue}”/>
        <Text TextAlignment =“Center”Value =“{sliderLabel}”/>
    </ StackPanel>
</ App>

TextInput和TextEdit

保险丝提供两种不同的控制输入和编辑文本:

在下面的例子中,TextInputTextEdit可以互换使用:

<JavaScript>
    var valueChanged = function(args){
        console.log(args.value);
    }}

    module.exports = {
        valueChanged:valueChanged
    };
</ JavaScript>

<TextInput ValueChanged =“{valueChanged}”/>

你也可以轻松做双向数据绑定:

<App Theme =“Basic”>
    <JavaScript>
        var Observable = require(“FuseJS / Observable”);

        var name = Observable(“”);

        var greeting = name.map(function(name){
            if(name ==“”){
                return“输入你的名字”;
            } else {
                return“Hello there,”+ name +“!”;
            }}
        });

        var clearName = function(){
            name.value =“”;
        }}

        module.exports = {
            name:name,
            问候:问候,
            clearName:clearName
        };
    </ JavaScript>

    <StackPanel>
        <StatusBarBackground />
        <DockPanel>
            <Text Dock =“Left”Alignment =“VerticalCenter”> Name:</ Text>
            <TextInput Value =“{name}”Alignment =“VerticalCenter”/>
        </ DockPanel>
        <Text TextAlignment =“Center”Value =“{greeting}”/>
        <Button Clicked =“{clearName}”Text =“Clear”/>
    </ StackPanel>
</ App>

如果要接受密码,您可能需要屏蔽用户输入:

<TextInput IsPassword =“true”/>

如果你想接受数值主要,你可以设置一个InputHint:

<TextInput InputHint =“Integer”/>

InputHint的有效值是DefaultEmailIntegerDecimalPhoneUrl。这些被称为“提示”,因为他们可能不会做任何事情,这取决于你在哪个平台。例如,当在桌面上时,键盘将是相同的,无论是什么提示添加到TextInput`。

TextInput也允许您通过多行输入内容,而不是向右滚动,默认情况下:

<TextInput IsMultiline =“true”/>

您也可以选择完全停用编辑功能:

<TextInput IsReadOnly =“true”/>

当一个TextInput获得焦点时,它通常会召唤设备的屏幕键盘。Fuse提供了许多机制来响应这个事件,其中一个是WhileKeyboardVisible:

<文本值=“某种说明”>
    <WhileKeyboardVisible>
        <Move Y =“ -  1”RelativeTo =“Keyboard”/>
    </ WhileKeyboardVisible>
</ Text>
<TextInput />

正如你可以看到,WhileKeyboardVisible可以附加到一个任意的元素,你可以做任何你想要的,作为对屏幕键盘占用屏幕上的空间的响应。

只读的“RenderValue”属性给你实际上正在绘制的字符串。例如,如果IsPassword为真,它将包含掩码密码(即••••••)。

Styling TextInput

CaretColor属性允许您更改插入符的颜色:

<TextInput CaretColor =“#ff0000”/>

如果你想改变选择的颜色,SelectionColor使你能做到:

<TextInput SelectionColor =“#00ffaa”/>

如果希望在TextInput为空时显示某个默认字符串,可以添加占位符值

<TextInput PlaceholderText =“我的占位符文本”/>

它也可以有一个单独的颜色

<TextInput PlaceholderText =“我的占位符文本”PlaceholderColor =“#eee”/>
章节

## ScrollView

保险丝有一个ScrollView,可以用于导航大于可用大小的内容。



</ ScrollView>

为了限制ScrollView的行为,你可以设置ScrollDirection:


</ ScrollView>

AllowedScrollDirections的有效设置包括Horizo​​ntalBothVertical(默认)。

ScrollingAnimation

可以基于绝对ScrollView位置来动画属性。例如,让我们删除一个顶部窗口,一个ScrollView向下滚动:

<App Theme =“Basic”Background =“#fff”>
    <Panel >
        <Panel 对齐=“顶部”高度=“50”ux:名称=“ledge”>
            <Text Alignment =“Center”TextAlignment =“Center”TextColor =“#fff”Value =“TopLedge”/>
            <Rectangle Fill =“#000”/>
        </ Panel>
        <ScrollView>
            <ScrollingAnimation From =“0”To =“50”>
                <Change ledge.Opacity =“0”/>
            </ ScrollingAnimation>
            <StackPanel>
                <!-- 阻止在scrollview中的顶部 -->
                <Panel 高度=“50”/>
                <!--  ... Content ...  -->
            </ StackPanel>
        </ ScrollView>
    </ Panel>
</ App>

NativeViewHost

某些视图仅作为本机组件可用。这些显然是与本机主题的开箱即用,但我们如何可以将它们与基于GraphicsTheme的应用程序中的自定义组件一起使用?通过合成它们与NativeViewHost!例如,这里是一个WebView添加了NativeViewHost:

<App Theme =“Basic”>
<Panel >
<NativeViewHost>
<WebView Url =“http://interwebs.com”/>
</ NativeViewHost>
</ Panel>
</ App>

请注意,在NativeViewHost中添加的视图总是呈现在您的其他Graphics主题内容的in front,因此您使用深度和渲染顺序需要考虑这一点。(例如:像<BringToFront>和`这样的东西可能不会像你期望的那样。)

要实现相反的目的,在Native主题中添加自定义组件和视图,请继续阅读。

GraphicsView

GraphicsViewNativeViewHost的对应部分,并允许您使用Native主题向App添加Fuse视图。

<App Theme =“Native”>
<StackPanel>
<Button Text =“我是原生按钮!/>
<GraphicsView>
<Button Text =“我是保险丝按钮!/>
</ GraphicsView>
</ StackPanel>
</ App>

NativeViewHost一样,注意当混合Native和Fuse视图时,深度排序会有不同的行为。

WebView

包括Web内容Fuse为Android和iOS提供了一个本地WebView组件。WebView只是本地的,因此需要包含在NativeViewHost中,如果您希望使用它与图形主题。

WebView可以用于通过http协议或通过加载HTML作为字符串来呈现Web内容,并且钩住一些有用的触发器来构建定制的浏览体验,例如PageBeginLoadingWhilePageLoadingPageLoaded 。导航触发器像GoBackGoForward与WebView特定的,如重新加载LoadUrlLoadHtml的补充。它也可以用于馈送ProgressAnimation

EvaluateJS触发器是值得注意的,因为它允许在WebView的上下文中运行任意的JavaScript,并将结果数据反馈到Fuse中:

<App Theme =“Native”Background =“#333”>
<JavaScript>
module.exports = {
onPageLoaded:function(res){
console.log(“WebView reached at”+ JSON.parse(res.json).url);
}}
};
</ JavaScript>
<DockPanel>
<StatusBarBackground Dock =“Top”/>
<NativeViewHost>
<WebView Dock =“Fill”Url =“http://www.google.com”>
<PageLoaded>
<EvaluateJS Handler =“{onPageLoaded}”>
var result = {
url:document.location.href
};
返回结果;
</ EvaluateJS>
</ PageLoaded>
</ WebView>
</ NativeViewHost>
<BottomBarBackground Dock =“Bottom”/>
</ DockPanel>
</ App>

WebView还可以通过包装HTML节点或通过LoadHtml触发器操作来提供原始HTML以显示:

<LoadHtml TargetNode =“myWebView”BaseUrl =“http://my.domain”Source =“{html}”/>

JavaScript API

WebView的某些方法通过JavaScript公开

  • goto(“http://myurl.com”)
  • loadHtml(“my html string”)
  • loadHtml(“my html string”,“http://my.baseurl.com”)
  • setBaseUrl(“http://my.baseurl.com”)

HTML

<HTML />是一个语义实用程序节点,用于使用原始HTML来提供WebView组件或LoadHtml操作:

<NativeViewHost>
<WebView>
<HTML>
<![CDATA [
<h1> Boom!</ h1>
]]>
</ HTML>
</ WebView>
</ NativeViewHost>
<LoadHtml>
<HTML>
<![CDATA [
<h1> Bang!</ h1>
]]>
</ HTML>
</ LoadHtml>

MapView

MapView允许您使用平台本地的映射API,在Android上使用Google地图和在iOS上使用苹果地图,向用户展示带注释,互动的全球范围的地图。

MapView是一个本地控件,因此需要包含在一个NativeViewHost中以与Graphics主题一起显示。与其他本地移动控件一样,目前没有`MapView’可用于桌面目标。

获取一个MapView包含在你的应用程序是简单的:简单地包括节点在你的UX中,你通常将与本机控件:

<NativeViewHost>
<MapView />
</ NativeViewHost>

要初始化和操作地图摄像机,请使用“纬度”,“经度”,“缩放”,“倾斜”和“轴承”属性,所有这些都是双向绑定。Zoom采用平台特定范围内的值,iOS上的米高于地面,Android上为“缩放因子”。

通过使用“Style”属性和“MapStyle”枚举设置渲染样式,可以进一步自定义地图。选项是“Normal”,“Satellite”和“Hybrid”。

Android上的地图

Google地图需要以下内容:

  • 在Unoproj中的Fuse.Maps包引用
  • Google Play图书馆。有关安装说明,请参阅本指南
  • 有效的Google Maps API金钥。按照Google文件取得一项设定。

一旦你有你的密钥,它必须添加到你的项目文件,如下所示:

“Android”:{
“Geo”:{
“ApiKey”:“your_key_here”
}}
}}

JavaScript API

MapView的某些方法通过JavaScript公开。

  • setMarkers([{latitude:0,longitude:0,label:“Zero”}])
  • setLocation(latitude,longitude)
  • setTilt(0.0)
  • setZoom(1.0)
  • setBearing(0.0)

MapMarker

要注释地图,您必须使用“MapMarker”节点来装饰它。MapMarker节点是包含“纬度”,“经度”和“标签”的简单值对象

<NativeViewHost>
<MapView>
<MapMarker Label =“Fuse HQLatitude =“59.9115573”Longitude =“10.73888”/>
</ MapView>
</ NativeViewHost>

如果你需要从JS动态生成MapMarkers,数据绑定和每个都是你的朋友。在我们编写脚本时,我们可能会勾选“MarkerTapped”事件来检测用户何时选择了标记。

<JavaScript>
var Observable = require(“FuseJS / Observable”);
exports.markers = Observable({latitude:30.282786,longitude:-97.741736,label:“Austin”});
exports.onMarkerTapped = function(args)
{
console.log(“Marker press:”+ args.label);
}}
</ JavaScript>
<NativeViewHost>
<MapView MarkerTapped = {onMarkerTapped}>
<每个项目= {markers}>
<MapMarker Latitude =“{latitude}”Longitude =“{longitude}”Label =“{label}”/>
</ Each>
</ MapView>
</ NativeViewHost>

Element

这里有一些常见的所有Element类型的属性:

HitTestMode

当与元素交互时,有时期望能够区分哪些元素可以与其交互以及如何进行交互。这通常被称为“命中测试”。在Fuse中,元素如何与用户输入交互可以使用HitTestMode设置。

考虑这个代码:

<Grid ColumnCount =“2”>
    <Rectangle Width =“100”Height =“100”Fill =“#808”>
        <Clicked>
            <DebugAction Message =“点击左侧”/>
        </ Clicked>
    </ Rectangle>
    <Rectangle Width =“100”Height =“100”Fill =“#808”HitTestMode =“None”>
        <Clicked>
            <DebugAction Message =“点击右键”/>
        </ Clicked>
    </ Rectangle>
</ Grid>

它将布局两个Rectangles并将Clicked触发器添加到它们。但是,当点击时,只有左边的一个会输出任何内容,因为在右边的矩形上显式地禁用了命中测试。如果你有视觉元素遮挡下面的元素,你想让下面的元素响应输入,这可能是非常有帮助的。

HitTestMode的有效值为:

  • HitTestMode.None:None - 这个元素不会做命中测试
  • HitTestMode.LocalBounds:LocalBounds - 这个元素将根据其大小进行命中测试
  • HitTestMode.LocalVisual:LocalVisual - 这个元素将根据其外观进行命中测试
  • HitTestMode.LocalBoundsAndChildren:LocalBoundsAndChildren - 点击测试将包括元素及其子元素的边界
  • HitTestMode.LocalVisualAndChildren:LocalVisualAndChildren - 命中测试将包括元素及其子元素的外观

ClipToBounds

通常,当将一个元素布置在另一个元素内部时,内部元素可以自由地居住在父元素之外:

<Panel 宽度=“100”高度=“100”>
        <Image Margin =“ -  100”File =“Pictures / Picture1.jpg”
            StretchMode =“UniformToFill”/>
</ Panel>

这个“图像”将显示为300pt宽和高,因为“Panel ”不会将孩子剪裁到其边界。

如果你打算把Image剪辑修改为它的父大小,只需在Panel中添加ClipToBounds即可:

<Panel 宽度=“100”高度=“100”ClipToBounds =“true”>
    <Image Margin =“ -  100”File =“Pictures / Picture1.jpg”
        StretchMode =“UniformToFill”/>
</ Panel>

现在,Image不会溢出Panel的边界。

Opacity

你可以使用Opacity属性设置对象的透明度。

<Panel 不透明度=“0.5” />

当“Opacity”设置为0.0时,元素是完全透明的,但仍会响应hit tests。当“Opacity”设置为1.0时,元素将处于其默认状态。

Layer

而不是分开布局,元素可以通过使用Layer属性作为父母的背景或叠加。

在以下示例中,按钮的文本将显示在矩形上方。

<Button Text =“Hello!”>
<Rectangle Fill =“#931”Layer =“Background”/>
</ Button>

Layer的有效值为:

  • Layout (默认) - 元素在布局中像往常一样,在“Background”和“Overlay”之间绘制
  • Background - 元素是在* Layout`层后面绘制的,并不影响布局
  • Overlay - 元素在 Layout`层的顶部绘制,并不影响布局

ZOffset

通常,元素按照在UX中显示的顺序绘制。
你可以通过使用ZOffset属性(默认为0)来影响这个排序。
具有较高“ZOffset”值的元素绘制在具有较低值的那些值之上。然而,他们仍然在他们的

在下面的示例中,蓝色矩形将出现在红色矩形的上方,即使它们的顺序告诉我们。

<Panel >
<Rectangle ZOffset =“1”Color =“Red”/>
<Rectangle ZOffset =“2”Color =“Blue”/>
</ Panel>
  • 注意:*儿童的Z顺序完全独立于3D中的Z轴。元素仍然可以转换为任何Z轴位置,旋转到Z维度,或具有实际深度,而与其子Z轴顺序无关。

关于控制:控制

在Fuse中,我们使用control来描述一个具有语义功能的UI组件,但在视觉外观上可能有很大的变化。

例如,Button定义了某些属性和事件,例如Clicked,但不同的themesstyles之间的按钮外观和感觉可能会有很大的不同。

效果

保险丝具有渲染一组可以添加到大多数控件的视觉效果的能力。重要的是要理解,为了使这些工作,你需要在图形模式; 原生主题在它们呈现这些效果的能力方面受到限制。

DropShadow

向元素添加DropShadow:

<Rectangle Width =“50”Height =“50”Fill =“#808”>
    <DropShadow />
</ Rectangle>

从一个软的“DropShadow”从上到下:

<Rectangle Width =“50”Height =“50”Fill =“#808”>
    <DropShadow Angle =“90”Distance =“12”Size =“20”Spread =“0.1”/>
</ Rectangle>

它也可以用于创造艺术效果,如外部发光:

<Panel Background =“#000”>
    <Circle Width =“50”Height =“50”Fill =“#808”>
        <DropShadow Distance =“0”Size =“50”Spread =“0.2”Color =“#ff06”/>
    </ Circle>
</ Panel>

DropShadow有以下属性:

  • `角度’ - 光从哪个方向来:
    • 0 - 右
    • 90 - 顶
    • 180 - 左
    • 270 - 底
  • `距离’ - 从阴影源的点的距离
  • Size - 阴影的大小
  • Spread - 阴影如何掉落。越接近0,线性越多。保持这个值低(实验低于1.0),否则你会得到工件
  • `颜色’ - dropshadow应该有哪种颜色。注意,这也支持Alpha通道调整阴影透明度(使用十六进制颜色值的第四个数字声明,例如#FFF0到#FFFF)。

Blur

模糊元素:

<Text Value =“Hello there!”>
    <Blur Ra​​dius =“0.9”/>
</ Text>

注意,虽然’Blur’的`Radius’可以像大多数其他属性一样动画,这可能是一个昂贵的操作,并且应该在设备上测试,以确保它的行为正确。

Desaturate

为了“去饱和”一个元素,完全或部分:

<Image File =“Pictures / Picture1.jpg”>
    <去饱和量=“0.4”/>
</ Image>

1.0的量将完全“去饱和”元素。

半色调

添加经典半色调效果:

<Image File =“Pictures / Picture1.jpg”>
    <半色调/>
</ Image>

Halftone接受:

  • Spacing - 点之间的距离(float,默认为0.5)
  • 平滑度' - 点边缘的硬或软的程度(float`,默认为2)
  • Intensity - 应用了多少效果(float,默认为1)
  • DotTint - 点的色调量(float,默认0.5)
  • PaperTint - 纸张的色泽量(float,默认值0.2)

Mask

保险丝允许你用一个图像或ImageSource来屏蔽一个元素。

<Rectangle Width =“50”Height =“50”>
    <Mask File =“Masks / Flower.png”/>
</ Rectangle>

“Mask”效果接受以下属性:

  • Mode - 如何解释掩码源
    • RGBA(默认) - 使用源图像的Alpha通道作为掩码,并将掩码中的RGB值与要屏蔽的元素的RGB值相乘
    • “Alpha” - 使用源图像的Alpha通道,而不接触来自遮罩元素的RGB值
    • “灰度” - 使用灰度掩码的颜色分量作为与原始Alpha值的乘法因子
  • File - 如果你有一个图片捆​​绑作为项目的一部分
  • Source - 如果你有另一个来源Image,例如HttpImageSource

如果您使用带有alpha通道的白色图像,“RGBA”和“Alpha”将具有相同的结果。

掩码将总是伸展自身以匹配要掩蔽的元素的大小。